package cn.avalon.service.impl;

import cn.avalon.domain.JsonResult;
import cn.avalon.domain.Movie;
import cn.avalon.dto.MovieDto;
import cn.avalon.dto.WatchMovieDto;
import cn.avalon.mapper.MovieMapper;
import cn.avalon.service.MovieService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.awt.image.Kernel;
import java.util.Date;

/**
 * @description:
 * @author: Avalon
 * @date: 2022年09月25日 ： 15:10
 * @version: ver1.0
 * @email 709785494@qq.com
 */
@Service
public class MovieServiceImpl implements MovieService {

    @Autowired
    private MovieMapper movieMapper;

    @Override
    public Movie findById(Long id) {
        return movieMapper.findById(id);
    }

    @Override
    public Movie findAll() {
        return movieMapper.findAll();
    }

    @Override
    public JsonResult buyMovie(MovieDto movieDto) {
        try {
            // 1.用户已购买，中间表存数据
            // 1.1判断中间表中是否有该用户购买该电影并且未使用的数据
            Integer count = movieMapper.find(movieDto);
            if (count == null) { // 中间表没有这个字段，表示之前没有消费过
                movieMapper.save(movieDto);
            } else { // 之前有消费过且还未使用的记录
                Integer allCount = movieDto.getCount() + count; // 计算总共的票数
                movieDto.setCount(allCount);
                movieMapper.updateRecord(movieDto); // 修改票数
            }
            // 2.电影票数减少，修改
            Movie movie = movieMapper.findById(movieDto.getId());
            movie.setStock(movie.getStock() - movieDto.getCount());
            movieMapper.update(movie);
            return new JsonResult();
        } catch (Exception e) {
            e.printStackTrace();
            return new JsonResult(false, "操作失败");
        }

    }

    @Override
    public JsonResult watchMovie(WatchMovieDto watchMovieDto) {
        try {
            // 根据id和userId和state查询是否购买电影票
            MovieDto movieDto = new MovieDto();
            movieDto.setId(watchMovieDto.getId());
            movieDto.setUserId(watchMovieDto.getUserId());
            movieDto.setState(0);
            Integer count = movieMapper.find(movieDto);
            // 判断票数多少
            if (count == null || count == 0) {
                return new JsonResult(false, "未购买该电影票！");
            }
            // 判断购买的电影票是否足够观看的电影票
            if (count < watchMovieDto.getCount()) {
                return new JsonResult(false, "余票不足，请购买！");
            }
            // 余票充足，确认电影票时间【通过id查询电影时间】
            Movie movie = movieMapper.findById(watchMovieDto.getId());
            // 判断是否在规定时间内使用电影票
            long time = new Date().getTime();
            long startTime = movie.getStart_time().getTime();
            long endTime = movie.getEnd_time().getTime();
            if (startTime > time) { // 电影还没有开始
                return new JsonResult(false, "电影还没有开始，请耐心等待");
            }
            if (endTime < time) { // 电影票过期
                return new JsonResult(false, "电影票已过期！");
            }
            // 电影票能正常使用
            // 1.去中间表中添加使用的记录
            // 1.1判断是否存在使用记录
            MovieDto dto = new MovieDto(watchMovieDto.getId(), watchMovieDto.getCount(), watchMovieDto.getUserId(), 1);
            Integer integer = movieMapper.find(dto); // 已经使用的票的数量
            if (integer == null) { // 数据库不存在使用记录
                movieMapper.save(dto);
            }
            // 存在使用记录
            Integer useCount = integer + watchMovieDto.getCount();
            MovieDto dto1 = new MovieDto(watchMovieDto.getId(), useCount, watchMovieDto.getUserId(), 1);
            movieMapper.updateRecord(dto1);
            // 2.修改已使用的记录
            Integer over = count - watchMovieDto.getCount();
            movieDto.setCount(over);
            movieMapper.updateRecord(movieDto);
            return new JsonResult();
        } catch (Exception e) {
            e.printStackTrace();
            return new JsonResult(false, "操作失败");
        }
    }
}
